1.4 初始化
i . 初始化方法
aiLit正常执行依赖并会长久持有Context对象,因此使用aiLit需要通过初始化操作传递Context对象等必备对象,建议在Application#onCreate()中进行初始化。考虑到潜在的内存泄露风险,目前初始化只支持传入Application对象不支持传入Activity、Service等Context子类对象,还望谅解。
aiLit入口类为AiLitContext类,其含有一簇初始化方法簇,请根据实际情况调用:
AiLitContext#initialize(Application context)
AiLitContext#initialize(Application context, OnSpeechReadyListener onSpeechReadyListener)
AiLitContext#initialize(Application context, LitConfiguration litConfiguration, OnSpeechReadyListener onSpeechReadyListener)
AiLitContext#initialize(Application context, SpeechConfig speechConfig, OnSpeechReadyListener onSpeechReadyListener)
ii . 语音就绪监听
因为天琴内部存在多款协同应用,涉及到多款应用内部的模块挂载、相互间的跨进程通信等多类操作,部分Api十分依赖时序。因此aiLit对外提供了语音就绪监听器,以便集成端能够感知语音就绪的时机并调用Api以保障功能的完备。当然,Api调用不在就绪监听中亦可(详见 1.1.6 失败调用)。
/**
* 语音准备就绪的监听器
*/
public interface OnSpeechReadyListener {
/**
* 语音准备就绪时回调
*/
void onSpeechReady();
/**
* 语音重启时回调
*/
void onSpeechRebooted();
}
向aiLit中注册就绪监听器有两种方式:
初始化时注册
在初始化 aiLit 时,可选择带有就绪监听器参数的初始化方法。通过此类方法注册的就绪监听器 持有回调最高优先级,当语音就后将会优先调用该类监听器。建议将较为重要的、全局的Api调用放入其中。
不限时机注册
当初始化完成后,依旧可以在任意代码段、任意时机下通过以下方法注册就绪监听器:
//默认优先级为AiLitContext.PRIORITY_NORMAL AiLitContext#addOnReadyListener(final OnSpeechReadyListener onReadyListener) AiLitContext#addOnReadyListener(int priority, final OnSpeechReadyListener onReadyListener)
建议集成端按照实际项目情况,将就绪监听器按照优先程度分级,以便关键的、影响范围较大的Api调用能够及早执行。
iii. 调用失败策略
当Api调用未包裹在就绪监听器中时,可能会因为天琴未启动、模块未挂载成功等原因而失败。针对此类失败调用( UnpreparedInvoke ),aiLit 提供了一套完备的、可定制的应急措施。具体如下:
- 定义Api的两个维度:是否同步、是否在主线程调用;
- 定义失败调用的三类处理方案:直接返回失败值/DirectReturn、进入缓存队列等待重试/QueueCache、阻塞当前线程直到语音就绪/Block;
- 使用策略模式,引入UnpreparedInvokeStrategy。该策略会根据Api的维度参数,决定调用失败时对应何种处理方案;
策略定义如下:
/**
* API失败调用的处理策略
*/
public interface UnpreparedInvokeStrategy {
/**
* 是否直接返回失败信息
*
* @param isMainThread 是否是主线程
* @param isSynchronousApi 是否需要同步返回
* @return 策略选项
*/
boolean isDirectReturn(boolean isMainThread, boolean isSynchronousApi);
/**
* 是否使用队列缓存调用,以便服务连接后处理
*
* @param isMainThread 是否是主线程
* @return 策略选项
*/
boolean isQueueCache(boolean isMainThread);
/**
* 是否阻塞当前线程直至服务连接
*
* @param isMainThread 是否是主线程
* @return 策略选项
*/
boolean isBlock(boolean isMainThread);
}
默认的UnpreparedInvokeStrategy实现为BlockFirstUnpreparedInvokeStrategy,其决策表如下:
维度 | 同步Api | 异步Api |
---|---|---|
主线程调用 | DirectReturn | QueueCache |
子线程调用 | Block | Block |
集成端可自由定制UnpreparedInvokeStrategy,具体步骤为:
1. 实现 com.aispeech.ipc.strategy.UnpreparedInvokeStrategy 接口
2. 通过构造模式创建LitConfiguration,并设置自定义策略
new LitConfiguration.Builder().setUnpreparedInvokeStrategy(自定义UnpreparedInvokeStrategy).build();
3. 调用aiLit初始化方法传入自定义策略
AiLitContext#initialize(Application context, LitConfiguration litConfiguration, OnSpeechReadyListener onSpeechReadyListener)
iiii. 语音定制
授权定制:
通过对接app传入"设备唯一授权ID", 解决客户ID只能定制获取方案(此方案语音助手将等待此ID再被动拉起), 此方案需要客户端同步开放定制, 使用时请联系开发人员.
// 用例参考
AiLitContext.initialize(application, new SpeechConfig.Builder().setDeviceId("授权设备唯一ID").build(), onSpeechReadyListener)
Tips. Speech模块的Api维度值示例
示例Api | 同步Api/异步Api | 依据 |
---|---|---|
setVoiceWakeUpEnable() | 异步 | 不关注返回值 |
getTtsResource() | 同步 | 依赖返回值 |
setTtsResource() | 异步 | 不关注返回值 |
startInteraction() | 同步 | 不关注返回值,但是不应延时触发或重试 |
stopInteraction() | 同步 | 不关注返回值,但是不应延时触发或重试 |
speak() | 同步 | 不关注返回值,但是不应延时触发或重试 |